// 当事件触发时，会执行这个事件的响应函数；
// 如果这个事件会被频繁触发，那么节流函数会按照一定的频率来执行函数；
// 不管在这个中间有多少次触发这个事件，执行函数的频繁总是固定的；

// 规定在一定的时间内，只能触发一次函数。如果在规定时间内触发多次函数，只有一次生效

function throttle(fn, interval, options = { leading: true, traling: true }) {
  let lastTime = 0;
  const { leading, traling, resultCallback } = options;
  let timer = null;
  const _throttle = function (...args) {
    return new Promise((resolve, reject) => {
      const nowTime = new Date().getTime();
      if (!leading && !lastTime) lastTime = nowTime;

      const remainTime = interval - (nowTime - lastTime);
      if (remainTime <= 0) {
        if (timer) {
          clearTimeout(timer);
          timer = null;
        }
        const result = fn.apply(this, args);
        lastTime = nowTime;
        if (resultCallback) resultCallback(result);
        resolve(result);
        return;
      }
      if (traling && !timer) {
        timer = setTimeout(() => {
          const result = fn.apply(this, args);
          lastTime = !leading ? 0 : new Date().getTime();
          timer = null;
          if (resultCallback) resultCallback(result);
          resolve(result);
        }, remainTime);
      }
    });
  };

  return _throttle;
}
